/**
 * @file CCmdLineParser.hpp Deklarácia triedy CCmdLineParser.
 *
 * @author Martin Kosorinský.
 * @date 8.11.2009.
 */

#ifndef CCMDLINEPARSER_HEADER
#define CCMDLINEPARSER_HEADER

#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <map>

using namespace std;

/**
 * @brief Parser command line parametrov programu.
 * Trieda zapúzdruje operácie potrebné pri analýze vstupných parametrov programu.
 * Procedúry sú konfigurovateľné prostredníctvom konštruktora.
 */
class CCmdLineParser {
private:
    /**
     * @brief Konfiguračný reťazec pre parser.
     */
    string flagsStr;
    /**
     * @brief Interná databáza nájdených parametrov a im priradených hodnôt.
     */
    map<char, char*> values;
public:
    /**
     * @brief Konštruktor objektu parsera command line parametrov.
     * Parametrami konštruktoru sú samotné vstupné parametre programu, ako aj konfiguračný reťazec.
     * Ten využíva parser pri analýze vstupných parametrov.
     * @param[in] argc Počet vstupných parametrov programu.
     * @param[in] argv Samotné vstupné parametre programu (počet položiek musí byť aspoň @a argc).
     * @param[in] flagsList Konfiguračný reťazec. Jeho formát je prevzatý z modulu @c getopt dostupného
     * s kompilátorom gcc. Reťazec môže obsahovať len písmena a znak ':', ktorý označuje hodnotové prepínače.
     */
    CCmdLineParser(int argc, char* argv[], char* flagsList);
    /**
     * @brief Primárny deštruktor.
     * Procedúra zabezpečuje korektnú dealokáciu položiek internej databázy prepínačov a im
     * priradených hodnôt.
     */
    ~CCmdLineParser();
    /**
     * @brief Funkcia, za pomoci ktorej je možné overiť, či bol zadaný konkrétny prepínač.
     * Funkcia prehľadáva lokálnu databázu parsera a na základe výsledku vyhľadávania vráti TRUE alebo
     * FALSE.
     * @param[in] flag Znak, ktorý predstavuje samotný prepínač (ak chceme overiť prítomnosť
     * prepínača -h tak parameter bude 'h') V prípade, že sa @a flag nenachádza v konfiguračnom reťazci
     * #flagsStr, funkcia je ukončená s chybovým hlásením.
     * @return Vráti TRUE, ak bol prepínač @a flag zadaní. V opačnom prípade vráti FALSE.
     */
    bool isSet(char flag);
    /**
     * @brief Funkcia, pomocou ktorej je možné pristupovať k hodnotám vstupných parametrov.
     * Funkcia prehľadáva lokálnu databázu parsera a na základe vstupnej hodnoty prepínača vráti
     * jeho hodnotu vo forme reťazca. V prípade, že prepínač nie je v zozname povolených, alebo je
     * vedený ako bezhodnotový, bude program ukončený s chybovým hlásením.
     * @param[in] flag Znak, ktorý predstavuje samotný prepínač.
     * @return Vráti smerník na reťazec obsahujúci príslušnú hodnotu parametra @a flag.
     */
    char* getValue(char flag);
};

#endif /* CCMDLINEPARSER_HEADER */


